確定了每個欄位的資料型態後,今天要進入 WSL2 的 Ubuntu 環境實作。會先建立專案資料夾架構,並透過 Claude Code 輔助撰寫 schema.sql 建立腳本與執行外鍵關聯設定。
在開始寫 SQL 前,先規劃好專案目錄結構,方便未來管理資料庫腳本與 PHP 核心程式。
library-system/
├── config/ # 資料庫連線與系統設定檔
├── sql/ # 資料庫初始化腳本
│ └── schema.sql # 資料庫建表與外鍵 SQL
├── public/ # 網頁入口與前端頁面
└── src/ # 商業邏輯與功能模組
根據架構在 WSL2 中建立資料夾
mkdir -p library-system/sql library-system/config library-system/public library-system/src
查看目錄
ls
進入專案目錄
cd library-system
Schema(資料庫綱要):就像是建築藍圖,定義了資料表欄位、資料型態與外鍵約束等「規則」,但不包含資料本身。
為什麼寫 SQL 腳本 schema.sql:
schema.sql 就能掌握全貌,寫出精準對應欄位的 PHP 程式碼。接下來在專案目錄下啟動 Claude Code,下以下指令讓它建立 sql/schema.sql 腳本:
對 Claude Code 下的 Prompt:
請幫我在 sql/schema.sql 建立資料庫初始化腳本:
1. 資料庫:建立並使用 library_system (utf8mb4)。
2. 資料表欄位:
- books: id (INT PK AI), title, author, isbn (UNIQUE), publish_year, category, total, available
- members: id (INT PK AI), name, email (UNIQUE), password, role, created_at
- loans: id (INT PK AI), member_id, book_id, borrowed_at, due_date, returned_at, status
3. 外鍵限制:loans 置於最後建表,並設定具名外鍵:
- CONSTRAINT fk_loans_member FOREIGN KEY (member_id) REFERENCES members(id) ON DELETE CASCADE
- CONSTRAINT fk_loans_book FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE
sql/schema.sql 腳本:
-- 1. 建立資料庫與選擇使用
CREATE DATABASE IF NOT EXISTS library_system
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
USE library_system;
-- 2. 建立書籍表 (books)
CREATE TABLE IF NOT EXISTS books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
author VARCHAR(255) NOT NULL,
isbn VARCHAR(20) NOT NULL UNIQUE,
publish_year INT,
category VARCHAR(100),
total INT NOT NULL DEFAULT 0, -- 館藏總數量
available INT NOT NULL DEFAULT 0, -- 目前可借數量(total 扣掉借出中的本數)
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- 3. 建立會員表 (members)
CREATE TABLE IF NOT EXISTS members (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
role VARCHAR(20) NOT NULL DEFAULT 'member',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- 4. 建立借閱表 (loans),須在 books、members 建立後才能建立外鍵
CREATE TABLE IF NOT EXISTS loans (
id INT AUTO_INCREMENT PRIMARY KEY,
member_id INT NOT NULL,
book_id INT NOT NULL,
borrowed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
due_date DATE NOT NULL,
returned_at DATETIME,
status VARCHAR(20) NOT NULL DEFAULT 'borrowed', -- 借閱狀態,例如 'borrowed'(借出中)、'returned'(已歸還)
CONSTRAINT fk_loans_member FOREIGN KEY (member_id) REFERENCES members(id) ON DELETE CASCADE,
CONSTRAINT fk_loans_book FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE
) ENGINE=InnoDB;
登入 MySQL:
sudo mysql -u root
查看資料表:
USE library_system;
SHOW TABLES;
查看具名外鍵:
SHOW CREATE TABLE loans\G
在輸出結果中確認腳本包含以下兩行,代表具名外鍵與資料表架構已建置完成:
CONSTRAINT `fk_loans_member` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_loans_book` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE
WSL2 環境採坑:
在 WSL2 執行 schema.sql 匯入時,遭遇了 Job for mysql.service failed 錯誤。
出現這行錯誤訊息:[ERROR] Can't start server: Bind on TCP/IP port: Address already in use (port: 3306)
原因是 Windows 主機 Port 衝突,我已經在 Windows 本地環境安裝過 MySQL,其背景服務在電腦開機時就自動鎖定了 3306 Port。
用 Windows 工作管理員解決:
- 按下快捷鍵 Ctrl + Shift + Esc 開啟 Windows 工作管理員。
- 切換至「服務」分頁
- 在列表中尋找 MySQL 或 MySQL80 服務。
- 點擊右鍵選擇 「停止」,釋放 3306 通訊埠。
完成以上步驟後,回到 WSL2 執行
sudo service mysql start重新啟動 Linux 版 MySQL,就可以執行匯入指令了。
今天完成了 books、members 與 loans 的 Schema 建置與外鍵,目前資料庫的骨架已經搭好,明天會撰寫腳本將測試資料正式匯入資料表中,讓整個系統真正動起來。